package com.gsbelarus.gedemin.income.fragment;

import android.content.Context;
import android.content.Intent;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;

import com.gsbelarus.gedemin.income.R;
import com.gsbelarus.gedemin.income.activity.ClientYear;
import com.gsbelarus.gedemin.income.activity.Main;
import com.gsbelarus.gedemin.income.adapter.ClientsListAdapter;
import com.gsbelarus.gedemin.income.sync.DataBaseHelper;
import com.gsbelarus.gedemin.income.table.ClientsTable;
import com.gsbelarus.gedemin.lib.ui.ArgumentsHelper;
import com.gsbelarus.gedemin.lib.ui.fragment.ListFragmentModel;

import java.util.Calendar;
import java.util.List;

public class ClientsListFrgm extends ListFragmentModel {

    /**
     * данные, полученные из БД, для вывода в list:
     * ClientsTable.id - id клиента
     * ClientsTable.name - имя клиента
     * ClientsTable.paidSum - оплаченная сумма за месяц
     * ClientsTable.planSum - плановая сумма за месяц
     */
    private List<ClientsTable> contacts;

    /**
     * связывает массив contacts с компонентом отображения list
     * (нужен в качестве глобальной переменной для поиска)
     */
    private ClientsListAdapter adapter;

    private SearchView searchView;

    /**
     * Вызывается при создании View или при смене ориентации экрана.
     * Может быть переопределен в классе наследнике
     *
     * @param rootView корневое View
     */
    @Override
    public void onCreateViewFragment(View rootView) {
        super.onCreateViewFragment(rootView);
        setHasOptionsMenu(true);
        argumentsHelper.selectedYear = Calendar.getInstance().get(Calendar.YEAR);
    }

    /**
     * обработчик нажатия на элемент списка:
     * создается интент для запуска нового потока (activity) ClientYear
     * для открытия формы Клиент.
     * В качестве параметров передаются выбранные год, месяц, ИД клиента, имя клиента
     */
    @Override
    public void onListItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        Intent intent = new Intent(getActivity(), ClientYear.class);
        intent.putExtra(ArgumentsHelper.ID, adapter.getItem(position).getId());
        intent.putExtra(ArgumentsHelper.SELECTED_YEAR, argumentsHelper.selectedYear);
        intent.putExtra(ArgumentsHelper.CLIENT_NAME, adapter.getItem(position).getName());
        startActivity(intent);
    }

    /**
     * Чтение данных из БД в новом потоке
     */
    @Override
    public void readDataBase() {
        DataBaseHelper dbh = DataBaseHelper.getInstance(context);
        contacts = dbh.getClientsList();
    }

    /**
     * Метод вызывается после чтения данных из БД или при смене ориентации экрана.
     * Может быть вызван до окончания выполнения потока для запроса данных из БД, поэтому следует проверять данные на null.
     * Служит для инициализации View данными
     *
     * @param rootView корневое View
     */
    @Override
    public void initView(View rootView) {
        if (contacts == null)
            return;
        adapter = new ClientsListAdapter(context, contacts);
        list.setAdapter(adapter);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        closeAndClearSearch();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if (Main.isDrawerOpen)
            return;
        inflater.inflate(R.menu.search_menu, menu);

        MenuItem menuItem = menu.findItem(R.id.action_search);
        searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
        if (searchView != null)
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String filter) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String filter) {
                    if (adapter != null)
                        adapter.getFilter().filter(filter);
                    return false;
                }
            });
        super.onCreateOptionsMenu(menu, inflater);
    }

    public void closeAndClearSearch() {
        if (searchView != null) {
            /** чистим, скрываем поле поиска и прямчем клавиатуру */
            searchView.setQuery("", false);
            searchView.setIconified(true);
            InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            View view = getView();
            if (view == null)
                return;
            inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
}